﻿<?php
require_once ('Zend/Controller/Plugin/Abstract.php');
/**
 * Controller plugin :
 * 		Thuc hien kiem tra cac request tu nguoi dung
 *		Kiem tra quyen cua nguoi dung truoc khi cho thuc hien yeu cau
 */

class Auth_Plugin_Controller extends Zend_Controller_Plugin_Abstract {

	 	
		private $_auth; //Bien authentication
    	
   	 	private $_noauth = array('module' => 'auth',
                             'controller' => 'login',
                            'action' => 'index');

 	  	private $_noacl = array('module' => 'auth',
                           'controller' => 'login',
                           'action' => 'erracl');
   
        private $_default = array('module' => 'default',
                           'controller' => 'index',
                           'action' => 'index');   
    
 	/**
 	 * Ham khoi tao 
 	 */  	
 	public function __construct($auth)
    {
        $this->_auth = $auth;
        //$this->_acl = $acl;
    }
	
    /**
     * Ham thuc hien kiem tra request cua nguoi dung
     */
	public function preDispatch($request)
	{
   	    $controller = $request->controller;		
		$action = $request->action;
		$module = $request->module;
		if($module=="default"){
			$request->setModuleName('default');
			$request->setControllerName($controller);
			$request->setActionName($action);          
		}
		$acl = new Zend_Acl();
		$roles = config::getSystemRoles();
		
		/* $writer = new Zend_Log_Writer_Stream('D:\trunk\danazen\application\log.txt');
		$logger = new Zend_Log($writer);
		$logger->info($this->_auth->getIdentity()->NAME); */
		
		if ($request->getModuleName() == 'default') {
            // controller
            $auth_config = config::getModule('default');
            $auth_controller = explode(',',$auth_config['controllers']);
            $auth_role = explode(',',$roles);
            $auth_allow = explode(',',$auth_config['allow']);
            $access_denined = $auth_config['gotourlandexit'];
            $auth_deny = "";
            
            foreach($auth_controller as $item){
                $acl->add(new Zend_Acl_Resource($item));	
            }
            foreach($auth_role as $item){
                $acl->addRole(new Zend_Acl_Role($item));                
            }
            foreach($auth_allow as $item){
                $acl->allow($item);
            }
            
            if($auth_config['deny'] != "")
            {
                $auth_deny = explode(',',$auth_config['deny']);
                foreach($auth_deny as $item){
                    $deny = explode(':',$item);
                    $acl->deny($deny[0],$deny[1]);
                }
            }
            
			$role = ($this->_auth->getIdentity() && $this->_auth->getIdentity()->STATUS = '1')? $this->_auth->getIdentity()->ROLEID : '1';
            
			$controller = $request->getControllerName();
			$action = $request->getActionName();
            
			/* Nếu request tới module Default mà ko có quyền đồng thời chưa đăng nhập (nghĩa là guest và module ko có phân quyền cho guest)
			thì chuyển tới trang thông báo ko cho truy cập */
			if (!$acl->isAllowed($role, $controller, $action)) {
                if (!$this->_auth->hasIdentity()) {
                    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
                    $redirector->gotoUrlAndExit($access_denined);
                }
			}
		}
        else{
            /******************************************************************************/ 
			/* Xử lý trong trường hợp request 1 module bình thường (Ko phải module Login) */ 
			/******************************************************************************/
			
			if($request->getModuleName() != "auth"){
                $auth_config = config::getModule($request->getModuleName());
                $isAuth = $auth_config['isauth'];
				
				//Nếu module request là module quản lý Authentication và user hiện chưa login thì redirect user về trang login
				if((int)$isAuth == 1 && !$this->_auth->getIdentity()){
					$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
					$redirector->gotoUrlAndExit('/auth/login/index');
                }
				
				// Lấy dữ liệu quản lý phân quyền trong file auth.ini (đã được lưu trong biến $auth_config.
                
		$auth_controller = explode(',',$auth_config['controllers']);
                $auth_role = explode(',',$roles);
                $auth_allow = explode(',',$auth_config['allow']);
                $access_denied = $auth_config['gotourlandexit'];
                $auth_deny = "";
				
				// Set dữ liệu vào đối tượng Zend_acl $acl
                foreach($auth_controller as $item){
					$acl->add(new Zend_Acl_Resource($item));	
                }
                foreach($auth_role as $item){
                    $acl->addRole(new Zend_Acl_Role($item));                
                }
                foreach($auth_allow as $item){
                    $acl->allow($item);
                }
                if($auth_config['deny'] != "")
                {
                    $auth_deny = split(',',$auth_config['deny']);
                    foreach($auth_deny as $item){
                        $deny = split(':',$item);
                        $acl->deny($deny[0],$deny[1]);
                    }
                }
                
				// Lấy role ID hiện tại của user
                $role = ($this->_auth->getIdentity() && $this->_auth->getIdentity()->STATUS = '1')? $this->_auth->getIdentity()->ROLEID : '1';
				
				// Lấy controller và action từ Request Object
                $controller = $request->getControllerName();
                $action = $request->getActionName(); 

				// Với module bình thường nếu ko được cho phép thì chuyển tới trang thông báo lỗi phân quyền
                if (!$acl->isAllowed($role, $controller, $action)){
                    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
                    $redirector->gotoUrlAndExit($access_denied);
                }
            }
        }
		
	}    
}